{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ffd1f2f1",
   "metadata": {},
   "source": [
    "运行环境：jupyter notebook"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "manual-chemistry",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import lightgbm as lgb\n",
    "import matplotlib.pyplot as plt\n",
    "import time\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score,roc_auc_score,roc_curve,auc,confusion_matrix,f1_score\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "51e854b9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>distance_from_home</th>\n",
       "      <th>distance_from_last_transaction</th>\n",
       "      <th>ratio_to_median_purchase_price</th>\n",
       "      <th>repeat_retailer</th>\n",
       "      <th>used_chip</th>\n",
       "      <th>used_pin_number</th>\n",
       "      <th>online_order</th>\n",
       "      <th>fraud</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>57.877857</td>\n",
       "      <td>0.311140</td>\n",
       "      <td>1.945940</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10.829943</td>\n",
       "      <td>0.175592</td>\n",
       "      <td>1.294219</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>5.091079</td>\n",
       "      <td>0.805153</td>\n",
       "      <td>0.427715</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2.247564</td>\n",
       "      <td>5.600044</td>\n",
       "      <td>0.362663</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>44.190936</td>\n",
       "      <td>0.566486</td>\n",
       "      <td>2.222767</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>5.586408</td>\n",
       "      <td>13.261073</td>\n",
       "      <td>0.064768</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>3.724019</td>\n",
       "      <td>0.956838</td>\n",
       "      <td>0.278465</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>4.848247</td>\n",
       "      <td>0.320735</td>\n",
       "      <td>1.273050</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0.876632</td>\n",
       "      <td>2.503609</td>\n",
       "      <td>1.516999</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>8.839047</td>\n",
       "      <td>2.970512</td>\n",
       "      <td>2.361683</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   distance_from_home  distance_from_last_transaction  \\\n",
       "0           57.877857                        0.311140   \n",
       "1           10.829943                        0.175592   \n",
       "2            5.091079                        0.805153   \n",
       "3            2.247564                        5.600044   \n",
       "4           44.190936                        0.566486   \n",
       "5            5.586408                       13.261073   \n",
       "6            3.724019                        0.956838   \n",
       "7            4.848247                        0.320735   \n",
       "8            0.876632                        2.503609   \n",
       "9            8.839047                        2.970512   \n",
       "\n",
       "   ratio_to_median_purchase_price  repeat_retailer  used_chip  \\\n",
       "0                        1.945940              1.0        1.0   \n",
       "1                        1.294219              1.0        0.0   \n",
       "2                        0.427715              1.0        0.0   \n",
       "3                        0.362663              1.0        1.0   \n",
       "4                        2.222767              1.0        1.0   \n",
       "5                        0.064768              1.0        0.0   \n",
       "6                        0.278465              1.0        0.0   \n",
       "7                        1.273050              1.0        0.0   \n",
       "8                        1.516999              0.0        0.0   \n",
       "9                        2.361683              1.0        0.0   \n",
       "\n",
       "   used_pin_number  online_order  fraud  \n",
       "0              0.0           0.0    0.0  \n",
       "1              0.0           0.0    0.0  \n",
       "2              0.0           1.0    0.0  \n",
       "3              0.0           1.0    0.0  \n",
       "4              0.0           1.0    0.0  \n",
       "5              0.0           0.0    0.0  \n",
       "6              0.0           1.0    0.0  \n",
       "7              1.0           0.0    0.0  \n",
       "8              0.0           0.0    0.0  \n",
       "9              0.0           1.0    0.0  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data=pd.read_csv('card_transdata.csv')\n",
    "data.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0157475b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0    912597\n",
       "1.0     87403\n",
       "Name: fraud, dtype: int64"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['fraud'].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a5ab6f0",
   "metadata": {},
   "source": [
    "# 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9106520f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "distance_from_home                0\n",
       "distance_from_last_transaction    0\n",
       "ratio_to_median_purchase_price    0\n",
       "repeat_retailer                   0\n",
       "used_chip                         0\n",
       "used_pin_number                   0\n",
       "online_order                      0\n",
       "fraud                             0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "##缺失值检查\n",
    "data.isna().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "95ef7dd3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "##重复值检查\n",
    "data.duplicated().sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "243e0658",
   "metadata": {},
   "source": [
    "无缺失值及重复值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "c4d604e4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1825194, 8)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "##过采样处理\n",
    "df1 = data.query('fraud == 0')\n",
    "df2 = data.query('fraud == 1').sample(len(df1),replace=True)\n",
    "data = pd.concat([df1,df2],axis=0).reset_index(drop=True)\n",
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "97b6b77e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0    912597\n",
       "1.0    912597\n",
       "Name: fraud, dtype: int64"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.fraud.value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "864112dd",
   "metadata": {},
   "source": [
    "# LightGBM建模预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "44784422",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集 fraud\n",
      "1.0      903493\n",
      "0.0      903449\n",
      "dtype: int64\n",
      "测试集 fraud\n",
      "0.0      9148\n",
      "1.0      9104\n",
      "dtype: int64\n"
     ]
    }
   ],
   "source": [
    "X = data.iloc[:,:-1]  ##特征列\n",
    "y = data.iloc[:,-1]   ##目标列\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=2022)\n",
    "\n",
    "cols = data.shape[1]\n",
    "X = data.iloc[:,0:cols-1]\n",
    "y = data.iloc[:,cols-1:cols]\n",
    "\n",
    "#划分固定的训练集和测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.01, random_state=123)\n",
    "print(\"训练集\",y_train.value_counts())\n",
    "print(\"测试集\",y_test.value_counts())\n",
    "\n",
    "scale = MinMaxScaler()  ##数据归一化，提高模型预测精度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "409c6cfb",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 模型参数\n",
    "params = {\n",
    "        'objective' : 'multiclass',\n",
    "        'num_class' : 2,\n",
    "        'num_leaves': 10, \n",
    "        'min_child_samples': 20,\n",
    "        'min_data_in_leaf': 0,\n",
    "        'max_depth': 3,\n",
    "        'learning_rate': 0.01,\n",
    "        \"min_sum_hessian_in_leaf\": 15,\n",
    "        \"boosting\": \"gbdt\",\n",
    "        \"feature_fraction\": 0.3,  \n",
    "        \"bagging_freq\": 1,\n",
    "        \"bagging_fraction\": 0.8,\n",
    "        \"bagging_seed\": 1,\n",
    "        \"lambda_l1\": 0.3,      #l1\n",
    "        'lambda_l2': 0.01,     #l2\n",
    "        \"verbosity\": -1,\n",
    "        \"nthread\": -1,                \n",
    "        \"random_state\": 1, \n",
    "        }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4cb56ef4",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "61b41478",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "fold n°1\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=0, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=0\n",
      "Training until validation scores don't improve for 500 rounds\n",
      "[100]\ttraining's multi_logloss: 0.547739\tvalid_1's multi_logloss: 0.556186\n",
      "[200]\ttraining's multi_logloss: 0.472264\tvalid_1's multi_logloss: 0.489429\n",
      "[300]\ttraining's multi_logloss: 0.407837\tvalid_1's multi_logloss: 0.434156\n",
      "[400]\ttraining's multi_logloss: 0.349387\tvalid_1's multi_logloss: 0.382766\n",
      "[500]\ttraining's multi_logloss: 0.313124\tvalid_1's multi_logloss: 0.352414\n",
      "[600]\ttraining's multi_logloss: 0.285641\tvalid_1's multi_logloss: 0.329823\n",
      "[700]\ttraining's multi_logloss: 0.258217\tvalid_1's multi_logloss: 0.306472\n",
      "[800]\ttraining's multi_logloss: 0.229004\tvalid_1's multi_logloss: 0.280054\n",
      "[900]\ttraining's multi_logloss: 0.211286\tvalid_1's multi_logloss: 0.26571\n",
      "[1000]\ttraining's multi_logloss: 0.197114\tvalid_1's multi_logloss: 0.253986\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's multi_logloss: 0.197114\tvalid_1's multi_logloss: 0.253986\n",
      "fold n°2\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=0, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=0\n",
      "Training until validation scores don't improve for 500 rounds\n",
      "[100]\ttraining's multi_logloss: 0.548019\tvalid_1's multi_logloss: 0.556699\n",
      "[200]\ttraining's multi_logloss: 0.472696\tvalid_1's multi_logloss: 0.490347\n",
      "[300]\ttraining's multi_logloss: 0.408417\tvalid_1's multi_logloss: 0.43547\n",
      "[400]\ttraining's multi_logloss: 0.3501\tvalid_1's multi_logloss: 0.384394\n",
      "[500]\ttraining's multi_logloss: 0.313933\tvalid_1's multi_logloss: 0.354318\n",
      "[600]\ttraining's multi_logloss: 0.286554\tvalid_1's multi_logloss: 0.331975\n",
      "[700]\ttraining's multi_logloss: 0.259189\tvalid_1's multi_logloss: 0.308798\n",
      "[800]\ttraining's multi_logloss: 0.23005\tvalid_1's multi_logloss: 0.282482\n",
      "[900]\ttraining's multi_logloss: 0.212351\tvalid_1's multi_logloss: 0.268259\n",
      "[1000]\ttraining's multi_logloss: 0.198187\tvalid_1's multi_logloss: 0.256615\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's multi_logloss: 0.198187\tvalid_1's multi_logloss: 0.256615\n",
      "fold n°3\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=0, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=0\n",
      "Training until validation scores don't improve for 500 rounds\n",
      "[100]\ttraining's multi_logloss: 0.548013\tvalid_1's multi_logloss: 0.55563\n",
      "[200]\ttraining's multi_logloss: 0.472729\tvalid_1's multi_logloss: 0.488794\n",
      "[300]\ttraining's multi_logloss: 0.408451\tvalid_1's multi_logloss: 0.433077\n",
      "[400]\ttraining's multi_logloss: 0.350175\tvalid_1's multi_logloss: 0.38261\n",
      "[500]\ttraining's multi_logloss: 0.313951\tvalid_1's multi_logloss: 0.352763\n",
      "[600]\ttraining's multi_logloss: 0.28652\tvalid_1's multi_logloss: 0.330863\n",
      "[700]\ttraining's multi_logloss: 0.259155\tvalid_1's multi_logloss: 0.308625\n",
      "[800]\ttraining's multi_logloss: 0.230022\tvalid_1's multi_logloss: 0.283878\n",
      "[900]\ttraining's multi_logloss: 0.212337\tvalid_1's multi_logloss: 0.271545\n",
      "[1000]\ttraining's multi_logloss: 0.198169\tvalid_1's multi_logloss: 0.261202\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's multi_logloss: 0.198169\tvalid_1's multi_logloss: 0.261202\n",
      "fold n°4\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=0, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=0\n",
      "Training until validation scores don't improve for 500 rounds\n",
      "[100]\ttraining's multi_logloss: 0.547971\tvalid_1's multi_logloss: 0.552601\n",
      "[200]\ttraining's multi_logloss: 0.472614\tvalid_1's multi_logloss: 0.482168\n",
      "[300]\ttraining's multi_logloss: 0.408302\tvalid_1's multi_logloss: 0.423058\n",
      "[400]\ttraining's multi_logloss: 0.349931\tvalid_1's multi_logloss: 0.368741\n",
      "[500]\ttraining's multi_logloss: 0.313894\tvalid_1's multi_logloss: 0.336125\n",
      "[600]\ttraining's multi_logloss: 0.286466\tvalid_1's multi_logloss: 0.311542\n",
      "[700]\ttraining's multi_logloss: 0.259109\tvalid_1's multi_logloss: 0.286549\n",
      "[800]\ttraining's multi_logloss: 0.230012\tvalid_1's multi_logloss: 0.25904\n",
      "[900]\ttraining's multi_logloss: 0.2124\tvalid_1's multi_logloss: 0.243393\n",
      "[1000]\ttraining's multi_logloss: 0.198208\tvalid_1's multi_logloss: 0.230594\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's multi_logloss: 0.198208\tvalid_1's multi_logloss: 0.230594\n",
      "fold n°5\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=0, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=0\n",
      "Training until validation scores don't improve for 500 rounds\n",
      "[100]\ttraining's multi_logloss: 0.547955\tvalid_1's multi_logloss: 0.556519\n",
      "[200]\ttraining's multi_logloss: 0.472602\tvalid_1's multi_logloss: 0.485401\n",
      "[300]\ttraining's multi_logloss: 0.408264\tvalid_1's multi_logloss: 0.424498\n",
      "[400]\ttraining's multi_logloss: 0.349913\tvalid_1's multi_logloss: 0.36908\n",
      "[500]\ttraining's multi_logloss: 0.313765\tvalid_1's multi_logloss: 0.335156\n",
      "[600]\ttraining's multi_logloss: 0.286323\tvalid_1's multi_logloss: 0.309605\n",
      "[700]\ttraining's multi_logloss: 0.258947\tvalid_1's multi_logloss: 0.284339\n",
      "[800]\ttraining's multi_logloss: 0.229792\tvalid_1's multi_logloss: 0.257744\n",
      "[900]\ttraining's multi_logloss: 0.212134\tvalid_1's multi_logloss: 0.241914\n",
      "[1000]\ttraining's multi_logloss: 0.197987\tvalid_1's multi_logloss: 0.229461\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's multi_logloss: 0.197987\tvalid_1's multi_logloss: 0.229461\n"
     ]
    }
   ],
   "source": [
    "##应用五折交叉提高模型稳定性\n",
    "evals_result = {}\n",
    "folds = StratifiedKFold(n_splits=5, shuffle=True, random_state=2022)\n",
    "oof = np.zeros([len(X_train),2])\n",
    "predictions = np.zeros([len(X_test),2])\n",
    "\n",
    "for fold_, (trn_idx, val_idx) in enumerate(folds.split(X_train, y_train)):\n",
    "    print(\"fold n°{}\".format(fold_+1))\n",
    "    #由k折交叉验证划分出来的训练集索引trn_idx和验证集索引val_idx定位到数据 并 对其归一化\n",
    "    x_train = scale.fit_transform(X_train.iloc[trn_idx])\n",
    "    x_val = scale.fit_transform(X_train.iloc[val_idx])\n",
    "    \n",
    "    #与对应的y标签拼接得到完整的从k折交叉验证中划分出来的训练集和验证集\n",
    "    trn_data = lgb.Dataset(x_train, y_train.iloc[trn_idx])\n",
    "    val_data = lgb.Dataset(x_val, y_train.iloc[val_idx])\n",
    "\n",
    "    #最大迭代数\n",
    "    num_round = 1000\n",
    "    start=time.perf_counter()\n",
    "    #用得到的数据训练模型\n",
    "    clf = lgb.train(params, \n",
    "                    trn_data, \n",
    "                    num_round, \n",
    "                    valid_sets = [trn_data, val_data], \n",
    "                    evals_result = evals_result,   #存放评估结果，即每次迭代的损失函数值\n",
    "                    verbose_eval = 100,   #表示每间隔100次迭代就输出一次信息 \n",
    "                    early_stopping_rounds = 500) #指定迭代多少次没有得到优化则停止训练\n",
    "    end=time.perf_counter()\n",
    "    x_test = scale.fit_transform(X_test)\n",
    "    #模型预测\n",
    "    #用具有最佳损失函数的那次模型来对对验证集做预测\n",
    "    oof[val_idx] = clf.predict(X_train.iloc[val_idx], num_iteration=clf.best_iteration)    \n",
    "    #用具有最佳损失函数的那次模型来对测试集做预测   predictions存放的两列值是测试集上属于0类和1类的概率\n",
    "    start2 =time.perf_counter()\n",
    "    predictions += clf.predict(x_test, num_iteration=clf.best_iteration) / folds.n_splits\n",
    "    end2 =time.perf_counter()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "6faeb550",
   "metadata": {},
   "outputs": [],
   "source": [
    "def best_confusion_matrix(y_test, y_test_predprob):\n",
    "    fpr, tpr, thresholds = roc_curve(y_test, y_test_predprob, pos_label=1)\n",
    "    cutoff = find_optimal_cutoff(tpr,fpr,thresholds)\n",
    "    y_pred = list(map(lambda x:1 if x>=cutoff else 0,y_test_predprob))\n",
    "    TN,FP,FN,TP = confusion_matrix(y_test,y_pred).ravel()\n",
    "    return cutoff,TN,FN,FP,TP"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "2740e335",
   "metadata": {},
   "outputs": [],
   "source": [
    "def find_optimal_cutoff(tpr,fpr,threshold):\n",
    "    optimal_idx = np.argmax(tpr - fpr)\n",
    "    optimal_threshold = threshold[optimal_idx]\n",
    "    return optimal_threshold"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "9f8677a8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练时间： 82.43762729999992\n",
      "测试时间： 0.133868399999983\n",
      "ACC： 0.8235809774271313\n",
      "F1： 0.8495327102803739\n",
      "presicion: 0.7263882815916047\n",
      "recall: 0.968914762741652\n"
     ]
    }
   ],
   "source": [
    "print(\"训练时间：\",end-start)\n",
    "print(\"测试时间：\",end2-start2)\n",
    "acc = accuracy_score(np.argmax(predictions,axis=1),y_test)\n",
    "\n",
    "print(\"ACC：\",acc)\n",
    "f1 = f1_score(y_test,np.argmax(predictions, axis=1))\n",
    "print(\"F1：\",f1)\n",
    "cutoff,TN,FN,FP,TP = best_confusion_matrix(y_test,predictions[:,1])\n",
    "best_recall,best_prec = TP/(TP+FN), TN/(FP+TN)\n",
    "print(\"presicion:\",best_prec)\n",
    "print(\"recall:\",best_recall)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "089afff9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8235809774271313"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "acc = accuracy_score(np.argmax(predictions,axis=1),y_test)\n",
    "acc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "bfadec61",
   "metadata": {},
   "outputs": [],
   "source": [
    "predictions1 = predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "prospective-justice",
   "metadata": {},
   "outputs": [],
   "source": [
    "# predictions\n",
    "# clf.best_iteration\n",
    "# folds.n_splits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "bce0aff0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# predictions.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "a744a374",
   "metadata": {},
   "outputs": [],
   "source": [
    "# predictions[0:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "c6c2e15a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# np.argmax(predictions, axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0916ca95",
   "metadata": {},
   "source": [
    "# 模型调参"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "8696343c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': 7, 'num_leaves': 70}"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "params_test={'max_depth': range(3,8,1),\n",
    "              'num_leaves':range(5, 100, 5)\n",
    "             }\n",
    "              \n",
    "gsearch = GridSearchCV(estimator = lgb.LGBMRegressor(boosting_type='gbdt',learning_rate=0.1, n_estimators=20, max_depth=6), \n",
    "                       param_grid = params_test, cv=5,n_jobs=-1)\n",
    "gsearch.fit(X_train,y_train)\n",
    "gsearch.best_params_ "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "26d672ba",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 更新模型参数\n",
    "params = {\n",
    "        'objective' : 'multiclass',\n",
    "        'num_class' : 2,\n",
    "        'num_leaves': 70, \n",
    "        'min_child_samples': 20,\n",
    "        'min_data_in_leaf': 0,\n",
    "        'max_depth': 7,\n",
    "        'learning_rate': 0.01,\n",
    "        \"min_sum_hessian_in_leaf\": 15,\n",
    "        \"boosting\": \"gbdt\",\n",
    "        \"feature_fraction\": 0.3,  \n",
    "        \"bagging_freq\": 1,\n",
    "        \"bagging_fraction\": 0.8,\n",
    "        \"bagging_seed\": 1,\n",
    "        \"lambda_l1\": 0.3,      #l1\n",
    "        'lambda_l2': 0.01,     #l2\n",
    "        \"verbosity\": -1,\n",
    "        \"nthread\": -1,                \n",
    "        \"random_state\": 1, \n",
    "        }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "4659d389",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "fold n°1\n",
      "Training until validation scores don't improve for 500 rounds\n",
      "[100]\ttraining's multi_logloss: 0.547596\tvalid_1's multi_logloss: 0.556015\n",
      "[200]\ttraining's multi_logloss: 0.47204\tvalid_1's multi_logloss: 0.489176\n",
      "[300]\ttraining's multi_logloss: 0.407554\tvalid_1's multi_logloss: 0.433811\n",
      "[400]\ttraining's multi_logloss: 0.349067\tvalid_1's multi_logloss: 0.382407\n",
      "[500]\ttraining's multi_logloss: 0.312759\tvalid_1's multi_logloss: 0.352056\n",
      "[600]\ttraining's multi_logloss: 0.285256\tvalid_1's multi_logloss: 0.32949\n",
      "[700]\ttraining's multi_logloss: 0.257816\tvalid_1's multi_logloss: 0.306149\n",
      "[800]\ttraining's multi_logloss: 0.228598\tvalid_1's multi_logloss: 0.279729\n",
      "[900]\ttraining's multi_logloss: 0.210835\tvalid_1's multi_logloss: 0.265348\n",
      "[1000]\ttraining's multi_logloss: 0.196659\tvalid_1's multi_logloss: 0.253631\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's multi_logloss: 0.196659\tvalid_1's multi_logloss: 0.253631\n",
      "fold n°2\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=0, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=0\n",
      "Training until validation scores don't improve for 500 rounds\n",
      "[100]\ttraining's multi_logloss: 0.547909\tvalid_1's multi_logloss: 0.556632\n",
      "[200]\ttraining's multi_logloss: 0.472474\tvalid_1's multi_logloss: 0.490228\n",
      "[300]\ttraining's multi_logloss: 0.408119\tvalid_1's multi_logloss: 0.435302\n",
      "[400]\ttraining's multi_logloss: 0.349771\tvalid_1's multi_logloss: 0.384201\n",
      "[500]\ttraining's multi_logloss: 0.31355\tvalid_1's multi_logloss: 0.3541\n",
      "[600]\ttraining's multi_logloss: 0.286111\tvalid_1's multi_logloss: 0.331718\n",
      "[700]\ttraining's multi_logloss: 0.258733\tvalid_1's multi_logloss: 0.308545\n",
      "[800]\ttraining's multi_logloss: 0.229591\tvalid_1's multi_logloss: 0.28223\n",
      "[900]\ttraining's multi_logloss: 0.211876\tvalid_1's multi_logloss: 0.267997\n",
      "[1000]\ttraining's multi_logloss: 0.197773\tvalid_1's multi_logloss: 0.25642\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's multi_logloss: 0.197773\tvalid_1's multi_logloss: 0.25642\n",
      "fold n°3\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=0, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=0\n",
      "Training until validation scores don't improve for 500 rounds\n",
      "[100]\ttraining's multi_logloss: 0.547849\tvalid_1's multi_logloss: 0.555558\n",
      "[200]\ttraining's multi_logloss: 0.472503\tvalid_1's multi_logloss: 0.488718\n",
      "[300]\ttraining's multi_logloss: 0.408143\tvalid_1's multi_logloss: 0.432969\n",
      "[400]\ttraining's multi_logloss: 0.349725\tvalid_1's multi_logloss: 0.382418\n",
      "[500]\ttraining's multi_logloss: 0.313526\tvalid_1's multi_logloss: 0.35265\n",
      "[600]\ttraining's multi_logloss: 0.286079\tvalid_1's multi_logloss: 0.330758\n",
      "[700]\ttraining's multi_logloss: 0.258704\tvalid_1's multi_logloss: 0.308524\n",
      "[800]\ttraining's multi_logloss: 0.229556\tvalid_1's multi_logloss: 0.283763\n",
      "[900]\ttraining's multi_logloss: 0.211867\tvalid_1's multi_logloss: 0.271418\n",
      "[1000]\ttraining's multi_logloss: 0.197703\tvalid_1's multi_logloss: 0.261074\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's multi_logloss: 0.197703\tvalid_1's multi_logloss: 0.261074\n",
      "fold n°4\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=0, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=0\n",
      "Training until validation scores don't improve for 500 rounds\n",
      "[100]\ttraining's multi_logloss: 0.547883\tvalid_1's multi_logloss: 0.55262\n",
      "[200]\ttraining's multi_logloss: 0.472408\tvalid_1's multi_logloss: 0.482137\n",
      "[300]\ttraining's multi_logloss: 0.408025\tvalid_1's multi_logloss: 0.423013\n",
      "[400]\ttraining's multi_logloss: 0.349597\tvalid_1's multi_logloss: 0.368653\n",
      "[500]\ttraining's multi_logloss: 0.313398\tvalid_1's multi_logloss: 0.335893\n",
      "[600]\ttraining's multi_logloss: 0.285953\tvalid_1's multi_logloss: 0.311321\n",
      "[700]\ttraining's multi_logloss: 0.258576\tvalid_1's multi_logloss: 0.286325\n",
      "[800]\ttraining's multi_logloss: 0.229432\tvalid_1's multi_logloss: 0.258783\n",
      "[900]\ttraining's multi_logloss: 0.211778\tvalid_1's multi_logloss: 0.243104\n",
      "[1000]\ttraining's multi_logloss: 0.197601\tvalid_1's multi_logloss: 0.230332\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's multi_logloss: 0.197601\tvalid_1's multi_logloss: 0.230332\n",
      "fold n°5\n",
      "[LightGBM] [Warning] min_data_in_leaf is set=0, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=0\n",
      "Training until validation scores don't improve for 500 rounds\n",
      "[100]\ttraining's multi_logloss: 0.547823\tvalid_1's multi_logloss: 0.556573\n",
      "[200]\ttraining's multi_logloss: 0.472367\tvalid_1's multi_logloss: 0.48545\n",
      "[300]\ttraining's multi_logloss: 0.407974\tvalid_1's multi_logloss: 0.424567\n",
      "[400]\ttraining's multi_logloss: 0.349578\tvalid_1's multi_logloss: 0.369155\n",
      "[500]\ttraining's multi_logloss: 0.313316\tvalid_1's multi_logloss: 0.335154\n",
      "[600]\ttraining's multi_logloss: 0.285857\tvalid_1's multi_logloss: 0.30962\n",
      "[700]\ttraining's multi_logloss: 0.258463\tvalid_1's multi_logloss: 0.284361\n",
      "[800]\ttraining's multi_logloss: 0.229298\tvalid_1's multi_logloss: 0.257771\n",
      "[900]\ttraining's multi_logloss: 0.211597\tvalid_1's multi_logloss: 0.241923\n",
      "[1000]\ttraining's multi_logloss: 0.197449\tvalid_1's multi_logloss: 0.229481\n",
      "Did not meet early stopping. Best iteration is:\n",
      "[1000]\ttraining's multi_logloss: 0.197449\tvalid_1's multi_logloss: 0.229481\n"
     ]
    }
   ],
   "source": [
    "##结合新参数进行五折交叉建模\n",
    "evals_result_ = {}\n",
    "folds = StratifiedKFold(n_splits=5, shuffle=True, random_state=2022)\n",
    "oof = np.zeros([len(X_train),2])\n",
    "predictions = np.zeros([len(X_test),2])\n",
    "for fold_, (trn_idx, val_idx) in enumerate(folds.split(X_train, y_train)):\n",
    "    print(\"fold n°{}\".format(fold_+1))\n",
    "    x_train = scale.fit_transform(X_train.iloc[trn_idx])\n",
    "    x_val = scale.fit_transform(X_train.iloc[val_idx])\n",
    "    \n",
    "    trn_data = lgb.Dataset(x_train, y_train.iloc[trn_idx])\n",
    "    val_data = lgb.Dataset(x_val, y_train.iloc[val_idx])\n",
    "\n",
    "    num_round = 1000\n",
    "    start +=time.perf_counter()\n",
    "    clf = lgb.train(params, \n",
    "                    trn_data, \n",
    "                    num_round, \n",
    "                    valid_sets = [trn_data, val_data], \n",
    "                    evals_result = evals_result_,\n",
    "                    verbose_eval = 100,   \n",
    "                    early_stopping_rounds = 500)\n",
    "    end +=time.perf_counter()\n",
    "    x_test = scale.fit_transform(X_test)\n",
    "    oof[val_idx] = clf.predict(X_train.iloc[val_idx], num_iteration=clf.best_iteration)   \n",
    "    start2 +=time.perf_counter()\n",
    "    predictions += clf.predict(x_test, num_iteration=clf.best_iteration) / folds.n_splits\n",
    "    end2 +=time.perf_counter()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "97b3beee",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.824183651106728"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "acc2 = accuracy_score(np.argmax(predictions,axis=1),y_test)\n",
    "acc2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "69d8c9a3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练时间： 110.18572055999994\n",
      "测试时间： 0.2566752999999153\n",
      "ACC： 0.824183651106728\n",
      "F1： 0.8500257045380193\n",
      "presicion: 0.7257324005247049\n",
      "recall: 0.9690246045694201\n"
     ]
    }
   ],
   "source": [
    "\n",
    "print(\"训练时间：\",(end-start)/ folds.n_splits)\n",
    "print(\"测试时间：\",(end2-start2)/ folds.n_splits)\n",
    "acc = accuracy_score(np.argmax(predictions,axis=1),y_test)\n",
    "\n",
    "print(\"ACC：\",acc)\n",
    "f1 = f1_score(y_test,np.argmax(predictions, axis=1))\n",
    "print(\"F1：\",f1)\n",
    "cutoff,TN,FN,FP,TP = best_confusion_matrix(y_test,predictions[:,1])\n",
    "best_recall,best_prec = TP/(TP+FN), TN/(FP+TN)\n",
    "print(\"presicion:\",best_prec)\n",
    "print(\"recall:\",best_recall)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "b05252ec",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "调整模型参数后准确率提高了：\n",
      "0.0\n"
     ]
    }
   ],
   "source": [
    "print('调整模型参数后准确率提高了：')\n",
    "print(acc2-acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "32ebd19b",
   "metadata": {},
   "outputs": [],
   "source": [
    "predictions2 = predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "07bd2cfe",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1.计算ROC曲线需要的假警报率（fpr）、命中率（tpr）及阈值（thres）\n",
    "from sklearn.metrics import roc_curve\n",
    "fpr, tpr, thres = roc_curve(y_test, predictions2[:,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "1bbb53cd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(thres[1:], tpr[1:])\n",
    "plt.plot(thres[1:], fpr[1:])\n",
    "plt.plot(thres[1:], tpr[1:] - fpr[1:])\n",
    "plt.xlabel('threshold')\n",
    "plt.legend(['tpr', 'fpr', 'tpr-fpr'])\n",
    "plt.gca().invert_xaxis() \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "3860d36d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.694757005094125"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "max(tpr - fpr)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "64d75de0",
   "metadata": {},
   "source": [
    "# 模型评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "045a0692",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.824183651106728"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "##使用acc准确率评估模型\n",
    "acc = accuracy_score(np.argmax(predictions,axis=1),y_test)\n",
    "acc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "713c0981",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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OnToQJMmTZg/fz4XXngheXl5DBkyhPz8fDp06MBXX33FpZdeyksvvVRjx5HK/5orgasTtCuJdYspP7xZP266yL7rl+4n6GFhZvslxR/P3rjpEmr4WI+vW5vVD/eryU0eMbFYjILBeemOcciinN+zp0+U86ci+4YNG/jZz35GSUkJ+/fvZ+DAgfTv35+2bduyd+9e+vTpAwQ3ckyePJkOHTowcOBA2rdvT506dXjqqaeoXbs2p59+Ovfeey89e/akbt26tGrViueeew6AG264gWuvvZbBgwfTvHlzZsyYEZkCtgB4SNJNZjYVQNK5wFZgkKRpQGOgJzCC8kWqALhVUi2gOX6DhXPO1ahOnTrxySefHND+xRdfVLrO2LFjGTt27AHtt9xyC7fccssB7fXr1+ell14iFouRl5d3WHkTSdlNHGEv6Sqgj6S/S1oJjAP+QDBcuIygyI00s68qrP4+sIZgiPBR4ONU5QSQNFHSWuAESWsljUvl/pxzzh2+lA4Im9l6YGCCWSPCV/yyBQQ3fpQWv8GVbDMjbnpconlm9hzwXFx7/2pyjgRGVrWMc865o4s/icM551wkRfOWnEMk6UOgXoXma80sPx15nHPOHbpjqoCZWffql3LOORcFPoTonHMukryAOeeciyQvYM455yLJC5hzzrlI8gLmnHMukryAOeeciyQvYM455yLJC5hzzrlI8gLmnHMukryAOeeciyQvYM455yLJC5hzzrlI8gLmnHMukryAOeeciyQvYC5Sfvvb3zJ06FA6dOjApEmTAFi6dCnnnXceubm5dO3alUWLFgGwZcsWevXqRUZGBsOGDSvbxq5du+jXrx/t2rWjQ4cOjB49Oh2H4pw7TCn9PjBJpwKTgHOBvUABcIeZfZZg2SzgdTPrmMpMiUjqAjwHHA+8CdxuZlbVOruLSsga/cYRSFfzfpVdzJAIZn/931oxdepUnn76aS6++GIuu+wy+vXrx8iRI7n33nvp27cvb775JiNHjiQWi1G/fn0eeOABVqxYwYoVK8pta/jw4fTq1Yt9+/bRu3dv3nrrLfr27ZumI3POHYqU9cAkCZgFxMysjZm1B8YAzVK1z8PwNHAzcFb4uiy9cVwin376Keeddx7169enTp06XHTRRcyaNQtJfPPNNwBs376d008/HYAGDRrQo0cP6tevX247J5xwAr169QLguOOOo3Pnzqxdu/bIHoxz7rClcgixF1BkZpNLG8xsKfA/kh6RtEJSvqRBFVeUNETSk3HvX5eUF07vkPRrSUsk/UlSN0kxSf+QdEXc+q9Imivpc0kTKwsp6TTgJDP7IOx1/R74UY2cAVejOnbsyHvvvcf27dvZtWsXb775JoWFhUyaNIkRI0ZwxhlnMHz4cCZMmJD0Nrdt28Zrr71G7969U5jcOZcKqRxC7AgsSdA+AMgFcoBM4CNJ7x3EdhsQ9OpGSZoFjAf6AO2BacCccLlc4ByCocvVkp4ws8IE22sOxP/5vTZsO4Ckmwl6amRmNuGe7OKDiH30aHZ8MIwYNRs3buTKK6/kl7/8JRkZGbRq1YqvvvqKsWPHcsMNN3DRRRfx7rvvMmDAAB577LGy9f72t7+xbt06YrFYue2VlJQwZswYLr/8cr788ku+/PLLlB/Djh07DsgRFVHODtHOH+XskLr8Kb0GVokewHQzKwE2SlpIcI1seZLr7wPmhtP5wF4zK5KUD2TFLTffzLYDSFoFtAISFTAlaEt4/cvMpgBTAFq2bmuP5afj9B2+X2UXE8XsBYPzyMvLo1+/fuTl5TFmzBhatGjBv//7vzNz5kwkcdFFF/Gb3/yGvLy879YrKGDHjh3l2gCuv/56unfvzuOPP37EjiEWix2QIyqinB2inT/K2SF1+VP5W2wlcHWC9kQFo6Jiyg9vxl/EKIq7wWI/QQ8LM9svKf549sZNl1D5sa4FWsS9bwGsry7g8XVrs/rhftUtdlSKxWIUDM5Ld4xDsmnTJgC+/PJLXnnlFT744AOeeOIJFi5cSF5eHgsWLOCss86qdjt33XUX27dv53e/+12qIzvnUiSVBWwB8JCkm8xsKoCkc4GtwCBJ04DGQE9gBOWLVAFwq6RaBMN53VIV0sw2SPpW0nnAh8B1wBOp2p87PD/+8Y8pLCykYcOGPPXUU5x88slMnTqV22+/neLiYurXr8+UKVPKls/KyuKbb75h3759vPrqq7zzzjucdNJJPPjgg7Rr147OnTsDMGzYMG688cZ0HZZz7hCkrICZmUm6CpgkaTSwh/A2eiADWEYwVDfSzL4Kb6Mv9T6whmCIcAXwcapyhn7Od7fRvxW+3FHoz3/+8wHDET169GDJkkSXW4Phw0Sq+ZSEcy4CUnohxMzWAwMTzBoRvuKXLSC48YNwiHBwJdvMiJsel2iemT1HUJBK2/tXk3Nx6b6dc85Fgz+JwznnXCRF71a0wyDpQ6BeheZrzSw/HXmcc84dumOqgJlZ93RncM45VzN8CNE551wkeQFzzjkXSV7AnHPORZIXMOecc5HkBcw551wkeQFzzjkXSV7AnHPORZIXMOecc5HkBcw551wkeQFzzjkXSV7AnHPORZIXMOecc5HkBcw551wkeQFzzjkXSV7AXJmsrCyys7PJzc2la9euANx999106tSJ3NxcLrnkEtavXw/Avn37GDp0KNnZ2eTk5BCLxcq2s2TJErKzs2nbti233XYbwRdsO+dczTqmvg+sJu0uKiFr9BvpjnFIfpVdzJC47AUP9yubfvfdd8nMzCx7P2LECB544AEAHn/8ce6//34mT57M1KlTAcjPz2fTpk307duXjz76iFq1avHzn/+cKVOmcN5553H55Zczd+5c+vbte4SOzjl3rEhpD0zSqZJmSPq7pFWS3pR0diXLZklakco8lez3BElvSPqbpJWSHj7SGY5mJ510Utn0zp07kQTAqlWr6N27NwBNmzalUaNGLF68mA0bNvDNN99w/vnnI4nrrruOV199NR3RnXPfcykrYAp+080CYmbWxszaA2OAZqna52F41MzaAecAF0o6JrsLkrjkkkvo0qULU6ZMKWsfO3YsZ5xxBi+88AL3338/ADk5OcyePZvi4mLWrFnDkiVLKCwsZN26dbRo0aJs3RYtWrBu3bojfizOue8/per6hKR/AcaZWc8K7QImAn0BA8ab2YuSsoDXzayjpCFAVzMbFq7zOkGRiUnaATwFXAxsJSiKE4GWwB1mNidc/wrgBKANMMvMRiaZ+7fACjObmmDezcDNAJmZTbrcM+mARSKh2fGwcfd377ObNwRg8+bNZGZmsnXrVoYPH85tt91GTk5O2XIvvPBC2bWvkpISJk+ezCeffEKzZs0oKSmhf//+ZGZmMnXqVB577DEAli9fzowZM3jooYdqLP+OHTvIyMiose0dSZ49faKcP8rZoXz+Xr16LTGzrjWx3VReA+sILEnQPgDIBXKATOAjSe8dxHYbEPTqRkmaBYwH+gDtgWnAnHC5XIIe1V5gtaQnzKywqg1LagT8EPhtovlmNgWYAtCydVt7LD+alxB/lV1MfPaCwXkHLLNs2TKKiorIy/tu3plnnkm/fv2YNm0aQNkQIsAFF1zAgAEDOPnkk5k0aVLZehs2bCA7O7vcdg5XLBar0e0dSZ49faKcP8rZIXX503EXYg9gupmVmNlGYCFw7kGsvw+YG07nAwvNrCiczopbbr6ZbTezPcAqoFVVG5VUB5gOPG5m/ziIPN8LO3fu5Ntvvy2bfuedd+jYsSOff/552TJz5syhXbt2AOzatYudO3cCMG/ePOrUqUP79u057bTTOPHEE/nrX/+KmfH73/+eK6+88sgfkHPuey+VXYiVwNUJ2pXEusWUL67146aL7Ltxz/0EPSzMbH9YhErtjZsuofpjnQJ8bmaTksjH8XVrszru7r0oicViB/S6Nm7cyFVXXQVAcXEx11xzDZdddhk//vGPWb16NbVq1aJVq1ZMnjwZgE2bNnHppZdSq1YtmjdvzvPPP1+2raeffpohQ4awe/du+vbt63cgOudSIpUFbAHwkKSbSq8nSTqX4LrVIEnTgMZAT2AE5YtUAXCrpFpAc6BbCnMiaTzQELgxlfs5mrVu3Zply5Yd0D5z5syEy2dlZbF69eqE87p27cqKFUf8hlLn3DEmZQXMzEzSVcAkSaOBPQSF6Q4gA1hGcBPHSDP7KryJo9T7wBqCYcEVwMepyimpBTAW+BvwcXib+JNm9rtU7dM559zhS+ldCGa2HhiYYNaI8BW/bAHBjR+EQ4SDK9lmRtz0uETzzOw54Lm49v5VZFxLcsOazjnnjiL+KCnnnHORlFQPTFIbYK2Z7ZWUB3QCfm9m21IXreZJ+hCoV6H5WjPLT0ce55xzhy7ZIcSZQFdJbYFnCD5r9Qfg8lQFSwUz657uDM4552pGskOI+82sGLgKmGRmdwKnpS6Wc845V7VkC1iRpJ8CPwNeD9vqpiaSc845V71kC9hQ4HzgQTNbI+lM4L9TF8s555yrWlLXwMxslaRRBA/MxczWAP61I84559ImqR6YpB8CSwmfQSgpV9KcKldyzjnnUijZIcRxBI9z2gZgZkuBM1OSyDnnnEtCsgWs2My2V2hLzReJOeecc0lI9nNgKyRdA9SWdBZwG/CX1MVyzjnnqpZsD+wXQAeCryj5A7Cd4KG8zjnnXFpU2wOTVBuYY2YXEzy13TnnnEu7antgZlYC7JLU8Ajkcc4555KS7DWwPUC+pHnAztJGM7stJamcc865aiRbwN4IX84559xRIambOMxsWqJXqsMdK66//nqaNm1Kx44dy9qWLVvG+eefT3Z2Nj/84Q/55ptvyuZNmDCBtm3b8oMf/IC3334bgF27dtGvXz/atWtHhw4dGD169BE/DuecO5KS/T6wNST43JeZta7xRBGxu6iErNGH3ykteLgfQ4YMYdiwYVx33XVl7TfeeCOPPvooF110Ec8++yyPPPIIDzzwAKtWrWLGjBmsXLmS9evXc/HFF/PZZ58BMHz4cHr16sW+ffvo3bs3b731Fn379j3sjM45dzRK9jb6rsC54ev/AI+TxMN8JZ0qaYakv0taJelNSWdXsmyWpBXJBq9JkuZKWiZppaTJ4Z2XR0zPnj1p3LhxubbVq1fTs2dPAPr06cPMmTMBmD17Nj/5yU+oV68eZ555Jm3btmXRokWccMIJ9OrVC4DjjjuOzp07s3bt2iN5GM45d0QlO4S4Je61zswmAf9S1TqSBMwCYmbWxszaA2OAZocbOgUGmlkO0BFoAvxrmvPQsWNH5swJHjf50ksvUVhYCMC6des444wzypZr0aIF69atK7futm3beO211+jdu/eRC+ycc0dYskOInePe1iLokZ1YzWq9gCIzm1zaYGZLFXgE6EswLDnezF6ssL8hQFczGxa+fx141MxiknYATwEXA1sJiuJEgifl32Fmc8L1rwBOANoAs8xsZGVBzaz0AlMd4DgqeUyWpJuBmwEyM5twT3ZxNaegerFYDICvvvqKnTt3lr2/5ZZbGD9+PCNGjODCCy+kVq1axGIx1q5dy6efflq23IYNG1i5ciWZmZkAlJSUMGbMGC6//HK+/PJLvvzyywP2uWPHjrL1oyjK+T17+kQ5f5SzQ+ryJ3sX4mNx08XAGmBgNet0BJYkaB8A5AI5QCbwkaT3kswB0ICgVzdK0ixgPNAHaA9MA0qfkp8LnEPw9JDVkp4ws8LKNirpbYIHFr8FvJxoGTObAkwBaNm6rT2Wn+zpq1zB4LzgZ0EBDRo0IC8vr2xe6TWxzz77jJUrV5KXl8cHH3wAULbchAkTuOSSSzj//POB4IaQ7t278/jjj1e6z1gsVm4/URPl/J49faKcP8rZIXX5k70GdoOZ9QpffczsZmDfIe6zBzDdzErMbCOwkODaWrL2EX6tC5APLDSzonA6K265+Wa23cz2AKuAVlVt1MwuBU4D6lHN8OiRsGnTJgD279/P+PHjueWWWwC44oormDFjBnv37mXNmjV8/vnndOvWDYC77rqL7du3M2nSpHTFds65IybZLsTLQOcEbV2qWGclcHWCdiWxv2LKF9f6cdNFZlY6xLefoIeFme2XFH88e+OmS0jiWM1sT/g9Z1cC86pa9vi6tVn9cL/qNpmUn/70p8RiMTZv3kyLFi2477772LFjB0899RQAAwYMYOjQoQB06NCBgQMH0r59e+rUqcNTTz1F7dq1Wbt2LQ8++CDt2rWjc+fgP9WwYcO48cYbaySjc84dbar8pS6pHcFDfBtKGhA36yTKF5VEFgAPSbrJzKaG2zuX4LrVIEnTgMZAT2BEhe0VALdKqgU0JxjaSwlJGcCJZrYhLICXA39O1f4SmT59esL222+/PWH72LFjGTu2/GMpW7RowXd13Tnnvv+q65X8AOgPNAJ+GNf+LXBTVSuamUm6CpgkaTTB46gKCJ5inwEsI7hZYqSZfSUpK2719wmus+UDK4CPkzqaQ9MAmCOpHlCboPBOrnoV55xz6VZlATOz2cBsSeeb2QcHu3EzW0/imz1GhK/4ZQsIbvwgHCIcXMk2M+KmxyWaZ2bPAc/FtfevIuNGDu4anHPOuaNAstfAPpH0fwmGE8uG+szs+pSkcs4556qR7F2IzwOnApcS3DXYgmAYMVIkfShpaYVXdrpzOeecO3jJ9sDamtm/SrrSzKZJ+gPwdiqDpYKZdU93BuecczUj2R5YUfhzm6SOQEPKf+bKOeecO6KS7YFNkXQycDfBky4ygHtSlso555yrRlIFzMx+F04uBI7Zr1Bxzjl39EhqCFFSM0nPSHorfN9e0g2pjeacc85VLtlrYM8R3LRxevj+M4IPJDvnnHNpkWwByzSzPxI8exAzKyZ4vqBzzjmXFskWsJ2STiH8nixJ5wHbU5bKOeecq0aydyH+kuDuwzaS3if41uJET5p3zjnnjojqnkbf0sy+NLOPJV1E8HBfAavD7+Byzjnn0qK6IcRX46ZfNLOVZrbCi5dzzrl0q66AxX/5pH/+yznn3FGjugJmlUw755xzaVXdTRw5kr4h6IkdH04TvjczOyml6ZxzzrlKVNkDM7PaZnaSmZ1oZnXC6dL3XrwO0fXXX0/Tpk3p2LHjAfMeffRRJLF582YA9u3bx9ChQ8nOziYnJ4dYLFa27IsvvkinTp3o0KEDI0eOPFLxnXPuqJDs58BcDRoyZAhz5849oL2wsJB58+bRsmXLsrapU6cCkJ+fz7x58/jVr37F/v372bJlCyNGjGD+/PmsXLmSjRs3Mn/+/CN2DM45l27Jfg7skEg6FZgEnAvsBQqAO8zsswTLZgGvm9mB3ZIUkxQDTgN2h02XmNmmqtbZXVRC1ug3DnpfBQ/3o2fPnhQUFBww784772TixIlceeWVZW2rVq2id+/eADRt2pRGjRqxePFiJHH22WfTpEkTAC6++GJmzpxZtqxzzn3fpawHJknALCBmZm3MrD0wBmiWqn0epsFmlhu+qixeqTBnzhyaN29OTk5OufacnBxmz55NcXExa9asYcmSJRQWFtK2bVv+9re/UVBQQHFxMa+++iqFhYVHOrZzzqVNKntgvYAiM5tc2mBmSxV4BOhLcGfjeDN7MX5FSUOArmY2LHz/OvComcUk7QCeAi4GthIUxYlAS4Le3Zxw/SuAE4A2wCwzO+yLRJJuBm4GyMxswj3ZxQe9jdJrWF999RU7d+4kFouxZ88eRo0axSOPPFL2/v3336dhw4a0adOGefPm0a5dO5o1a0a7du349NNPOeWUU7j11lvp27cvtWrVokOHDmzbtq3cNbLK7NixI6nljlZRzu/Z0yfK+aOcHVKXP5UFrCOwJEH7ACAXyAEygY8kvXcQ221A0KsbJWkWMB7oA7QHphE88opwH+cQDF2ulvSEmVXVRfn/JJUAMwmK6gEfGzCzKcAUgJat29pj+Qd/+goG5wU/Cwpo0KABeXl55Ofns2XLFoYNGwbA5s2b+cUvfsGiRYs49dRTyw0LXnDBBQwYMID27duTl5fHmDFjAJgyZQpffPEFeXl51WaIxWJJLXe0inJ+z54+Uc4f5eyQuvwpvQZWiR7AdDMrATZKWkhwjWx5kuvvA0rvgMgH9ppZkaR8ICtuuflmth1A0iqgFVBZARtsZusknUhQwK4Ffn8Qx3RYsrOz2bTpu1HLrKwsFi9eTGZmJrt27cLMaNCgAfPmzaNOnTq0b98egE2bNtG0aVO2bt3Kf/7nf/LHP/7xSEV2zrm0S2UBW0niB/4qQVtFxZS/Plc/broorne0n6CHhZntlxR/PHvjpkuo4ljNbF3481tJfwC6UU0BO75ubVY/3K+640jopz/9KbFYjM2bN9OiRQvuu+8+brgh8feDbtq0iUsvvZRatWrRvHlznn/++bJ5t99+O8uWLQPgnnvu4eyzzz6kPM45F0WpLGALgIck3WRmUwEknUtw3WqQpGlAY6AnMILyRaoAuFVSLaA5QUFJibDoNTKzzZLqAv2BP6VqfwDTp0+vcn78HYpZWVmsXr36kLbjnHPfZykrYGZmkq4CJkkaDewhvI0eyACWEdzEMdLMvgpvoy/1PrCGYIhwBfBxqnIC9YC3w+JVm6B4TU3h/pxzztWAlF4DM7P1wMAEs0aEr/hlCwhu/CAcIhxcyTYz4qbHJZpnZs8Bz8W1968i406gSxWH4Zxz7ijkT+JwzjkXSem4CzFtJH1IMGQY71ozy09HHuecc4fumCpgZtY93Rmcc87VDB9CdM45F0lewJxzzkWSFzDnnHOR5AXMOedcJHkBc845F0lewJxzzkWSFzDnnHOR5AXMOedcJHkBc845F0lewJxzzkWSFzDnnHOR5AXMOedcJHkBc845F0lewFIgKyuL7OxscnNz6dq1KwDjxo2jefPm5Obmkpuby5tvvgnAvHnz6NKlC9nZ2XTp0oUFCxakM7pzzkXGMfV1KkfSu+++S2ZmZrm2O++8k+HDh5dry8zM5LXXXuP0009nxYoVXHrppaxbt+5IRnXOuUhKaQGTdCowCTgX2AsUAHeY2WcJls0CXjezjqnMlIik44AngTxgPzDWzGZWtc7uohKyRr9Rrq3g4X4Hve9zzjmnbLpDhw7s2bOHvXv3Uq9exe/ddM45Fy9lQ4iSBMwCYmbWxszaA2OAZqna52EYC2wys7OB9sDCw9mYJC655BK6dOnClClTytqffPJJOnXqxPXXX8/WrVsPWG/mzJmcc845Xryccy4JMrPUbFj6F2CcmfWs0C5gItAXMGC8mb0Y3wOTNAToambDwnVeBx41s5ikHcBTwMXAVoKiOBFoSdC7mxOufwVwAtAGmGVmI6vIWgi0M7Od1RzTzcDNAJmZTbrcM2lqufnZzRsCsHnzZjIzM9m6dSvDhw/ntttu44wzzqBhw4ZI4tlnn2XLli2MGjWqbN01a9Zw1113MXHiRJo3b15VjMO2Y8cOMjIyUrqPVIpyfs+ePlHOH+XsUD5/r169lphZ15rYbiqHEDsCSxK0DwBygRwgE/hI0nsHsd0GBL26UZJmAeOBPgQ9p2nAnHC5XOAcgqHL1ZKeMLPCihuT1CicfEBSHvB3YJiZbay4rJlNAaYAtGzd1h7LL3/6CgbnHRB22bJlFBUVMWDAgLK21q1b079/f/LyguXXrl3LzTffzB//+EcuvPDCZM7BYYnFYmX7jqIo5/fs6RPl/FHODqnLn467EHsA082sJCwSCwmukSVrHzA3nM4HFppZUTidFbfcfDPbbmZ7gFVAq0q2VwdoAbxvZp2BD4BHDyJPOTt37uTbb78tm37nnXfo2LEjGzZsKFtm1qxZdOwYXOrbtm0b/fr1Y8KECUekeDnn3PdFKntgK4GrE7QriXWLKV9c68dNF9l34577CXpYmNl+SfHHszduuoTKj3ULsIvgeh3AS8AN1QU8vm5tVie4aWPjxo1cddVVwUEUF3PNNddw2WWXce2117J06VIkkZWVxX/9138BwXWxL774ggceeIAHHngAgHfeeYemTZtWF8E5545pqSxgC4CHJN1kZlMBJJ1LcN1qkKRpQGOgJzCC8kWqALhVUi2gOdAtVSHNzCS9RnAH4gKgN0GP7ZC0bt2aZcuWHdD+/PPPJ1z+rrvu4q677jrU3Tnn3DErZQUsLAxXAZMkjQb2EN5GD2QAywhu4hhpZl+FN3GUeh9YQzAsuAL4OFU5Q6OA5yVNAr4GhqZ4f8455w5TSj8HZmbrgYEJZo0IX/HLFhDc+EE4RDi4km1mxE2PSzTPzJ4Dnotr719Nzn8S9ASdc85FhD9KyjnnXCQdU4+SkvQhUPFTwteaWX468jjnnDt0x1QBM7Pu6c7gnHOuZvgQonPOuUjyAuaccy6SvIA555yLJC9gzjnnIskLmHPOuUjyAuaccy6SvIA555yLJC9gzjnnIskLmHPOuUjyAuaccy6SvIA555yLJC9gzjnnIskLmHPOuUjyAlZD9uzZQ7du3cjJyaFDhw7ce++95eY/+uijSGLz5s0A7Nu3j6FDh5KdnU1OTg6xWCwNqZ1zLrqOqa9TSaV69eqxYMECMjIyKCoqokePHvTt25fzzjuPwsJC5s2bR8uWLcuWnzp1KgD5+fls2rSJvn378tFHH1Grlv9N4ZxzyUjpb0tJp0qaIenvklZJelPS2ZUsmyVpRSrzVEfSnGQz7C4qIWv0G2SNfqN0XTIyMgAoKiqiqKgISQDceeedTJw4sew9wKpVq+jduzcATZs2pVGjRixevLhGj8c5577PUlbAFPy2ngXEzKyNmbUHxgDNUrXPwyFpALDjcLZRUlJCbm4uTZs2pU+fPnTv3p05c+bQvHlzcnJyyi2bk5PD7NmzKS4uZs2aNSxZsoTCwsLD2b1zzh1TUtkD6wUUmdnk0gYzWwr8j6RHJK2QlC9pUMUVJQ2R9GTc+9cl5YXTOyT9WtISSX+S1E1STNI/JF0Rt/4rkuZK+lzSxKqCSsoAfgmMP5wDrl27NkuXLmXt2rUsWrSI5cuX8+CDD3L//fcfsOz1119PixYt6Nq1K3fccQcXXHABder4iK5zziVLZpaaDUu3AWea2Z0V2n8M3AJcBmQCHwHdgXrA62bWUdIQoKuZDQvXeR141Mxikgy43MzekjQLaAD0A9oD08wsN1z/HuAcYC+wGuhhZgm7OJJ+A7wHfFKaoZLlbgZuBsjMbNLlnknBdazs5g0PWHbatGlIYtasWdSrVw+Ar7/+mszMTJ5++mkaN25cbvlhw4YxfPhwsrKyEp7PmrRjx46y4c4oinJ+z54+Uc4f5exQPn+vXr2WmFnXmthuOv7k7wFMN7MSYKOkhcC5wPIk198HzA2n84G9ZlYkKR/IiltuvpltB5C0CmgFHFDAJOUCbc3sTklZFefHM7MpwBSAlq3b2mP5wekrGJzH119/Td26dWnUqBG7d+/m7rvvZtSoUTz77LNl62dlZbF48WIyMzPZtWsXZkaDBg2YN28ejRs3ZsiQIUmegsMTi8XIy8s7IvtKhSjn9+zpE+X8Uc4OqcufygK2Erg6QbsStFVUTPnhzfpx00X2XbdxP0EPCzPbLyn+ePbGTZdQ+bGeD3SRVBAu01RSzMzyqgp4fN3arH64X9n7DRs28LOf/YySkhL279/PwIED6d+/f6Xrb9q0iUsvvZRatWrRvHlznn/++ap255xzroJUFrAFwEOSbjKzqQCSzgW2AoMkTQMaAz2BEZQvUgXArZJqAc2BbqkKaWZPA0+H+bIIhhDzDnY7nTp14pNPPqlymYKCgrLprKwsVq9efbC7cc45F0pZATMzk3QVMEnSaGAPQWG6A8gAlgEGjDSzryoM370PrCEYIlwBfJyqnM4556IppdfAzGw9MDDBrBHhK37ZAqBjOG3A4Eq2mRE3PS7RPDN7Dngurr3ysbxKMjjnnDu6+WMfnHPORdIx9cEjSR8S3K4f71ozy09HHuecc4fumCpgZtY93Rmcc87VDB9CdM45F0lewJxzzkWSFzDnnHOR5AXMOedcJHkBc845F0lewJxzzkWSFzDnnHOR5AXMOedcJHkBc845F0lewJxzzkWSFzDnnHOR5AXMOedcJHkBc845F0lewJxzzkWSFzDnnHOR5AXMOedcJHkBc845F0lewJxzzkWSzCzdGSJJ0rfA6nTnOESZwOZ0hzgMUc7v2dMnyvmjnB3K529lZk1qYqN1amIjx6jVZtY13SEOhaTFUc0O0c7v2dMnyvmjnB1Sl9+HEJ1zzkWSFzDnnHOR5AXs0E1Jd4DDEOXsEO38nj19opw/ytkhRfn9Jg7nnHOR5D0w55xzkeQFzDnnXCR5ATtIki6TtFrSF5JGpztPKUkFkvIlLZW0OGxrLGmepM/DnyfHLf/v4TGslnRpXHuXcDtfSHpcklKU91lJmyStiGursbyS6kl6MWz/UFJWirOPk7QuPP9LJV1+lGY/Q9K7kj6VtFLS7WF7VM59ZfmP+vMvqb6kRZKWhdnvC9ujcu4ry5++c29m/kryBdQG/g60Bo4DlgHt050rzFYAZFZomwiMDqdHA78Op9uH2esBZ4bHVDuctwg4HxDwFtA3RXl7Ap2BFanIC9wKTA6nfwK8mOLs44DhCZY92rKfBnQOp08EPgszRuXcV5b/qD//4X4ywum6wIfAeRE695XlT9u59x7YwekGfGFm/zCzfcAM4Mo0Z6rKlcC0cHoa8KO49hlmttfM1gBfAN0knQacZGYfWPB/0O/j1qlRZvYe8L8pzBu/rZeB3qV/5aUoe2WOtuwbzOzjcPpb4FOgOdE595Xlr8xRk98CO8K3dcOXEZ1zX1n+yqQ8vxewg9McKIx7v5aq//EcSQa8I2mJpJvDtmZmtgGCf/hA07C9suNoHk5XbD9SajJv2TpmVgxsB05JWfLAMEnLFQwxlg4DHbXZw+GZcwj+ko7cua+QHyJw/iXVlrQU2ATMM7NInftK8kOazr0XsIOT6C+Bo+VzCBeaWWegL/B/JfWsYtnKjuNoPb5DyXukj+VpoA2QC2wAHqsmR1qzS8oAZgJ3mNk3VS1aSZajLX8kzr+ZlZhZLtCCoDfSsYrFj6rsUGn+tJ17L2AHZy1wRtz7FsD6NGUpx8zWhz83AbMIhjs3ht11wp+bwsUrO4614XTF9iOlJvOWrSOpDtCQ5If9DpqZbQz/ce8HphKc/6Myu6S6BL/8XzCzV8LmyJz7RPmjdP7DvNuAGHAZETr3ifKn89x7ATs4HwFnSTpT0nEEFxnnpDkTkhpIOrF0GrgEWEGQ7WfhYj8DZofTc4CfhHf8nAmcBSwKhy++lXReOO58Xdw6R0JN5o3f1tXAgnC8PSVKfwGFriI4/0dd9nBfzwCfmtl/xM2KxLmvLH8Uzr+kJpIahdPHAxcDfyM65z5h/rSe+6ru8PBXwjtxLie48+nvwNh05wkztSa422cZsLI0F8HY8Xzg8/Bn47h1xobHsJq4Ow2BruH/gH8HniR8WksKMk8nGG4oIvir64aazAvUB14iuHC8CGid4uzPA/nA8vAf4WlHafYeBEMyy4Gl4evyCJ37yvIf9ecf6AR8EmZcAdxT0/9OU3zuK8uftnPvj5JyzjkXST6E6JxzLpK8gDnnnIskL2DOOeciyQuYc865SPIC5pxzLpK8gDlXgaQSffdk7aXVPhE78TZ+JKl9CuIh6XRJL6di21XsM1dxTxl37mhQJ90BnDsK7bbgcTmH40fA68CqZFeQVMeC579VyYKnrlx96NEOTvhEhFyCz+68eaT261x1vAfmXBIUfH/RwvBhyW/HPfrnJkkfKfiOpJmSTpB0AXAF8EjYg2sjKSapa7hOpqSCcHqIpJckvUbwMOYG4QNRP5L0iaQDvu1AUpbC7yIL139V0muS1kgaJumX4bp/ldQ4XC4maZKkv0haIalb2N44XH95uHynsH2cpCmS3iF4Wvj9wKDweAZJ6hZu65Pw5w/i8rwiaa6C77eaGJf7Mkkfh+dqfthW7fE6V6ma+pS2v/z1fXkBJXz3lIdZBF8b8RegSTh/EPBsOH1K3HrjgV+E088BV8fNiwFdw+lMoCCcHkLwNI/G4fuHgH8LpxsRPPWlQYV8WYTfRRau/wXBd2M1IXh69y3hvN8QPOy2dP9Tw+meces/AdwbTv8LsDScHgcsAY6P28+TcRlOAuqE0xcDM+OW+wfBM+zqA/8keLZdE4KnjJ8ZLpf08frLX5W9fAjRuQOVG0JU8MTtjsC84NFt1CZ4lBRAR0njCX75ZgBvH8L+5plZ6QNLLwGukDQ8fF8faEnwvVeVedeC78b6VtJ24LWwPZ/g8T+lpkPwfWaSTgqfa9cD+HHYvkDSKZIahsvPMbPdleyzITBN0lkEj3aqGzdvvpltB5C0CmgFnAy8Z8H3QnGYx+sc4NfAnEuGgJVmdn6Cec8BPzKzZZKGAHmVbKOY74bs61eYt7PCvn5sZqsPIt/euOn9ce/3U/7feMXnxlX31RY7E8wr9QBB4bwqvMklVkmekjCDEuwfDu14nQP8GphzyVgNNJF0PgRf5yGpQzjvRGCDgq/4GBy3zrfhvFIFQJdwuqobMN4GfhE+pRtJ5xx+/DKDwm32ALaHvaT3CHNLygM2W+LvB6t4PA2BdeH0kCT2/QFwUfhUckqvzZHa43Xfc17AnKuGme0jKDq/lrSM4NrYBeHsuwm+EXgewVdjlJoBjAhvTGgDPAr8XNJfCK6BVeYBguG45eGNGg/U4KFsDfc/meAJ+hBc6+oqaTnwMN99lUVF7wLtS2/iACYCEyS9TzCkWiUz+xq4GXglPIcvhrNSebzue86fRu/cMUBSDBhuZovTncW5muI9MOecc5HkPTDnnHOR5D0w55xzkeQFzDnnXCR5AXPOORdJXsCcc85Fkhcw55xzkfT/A73Nyafne3R2AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "## 显示重要特征\n",
    "from lightgbm import plot_importance\n",
    "plot_importance(clf)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "6297df0a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "##绘制模型训练时loss值的变化趋势\n",
    "plt.plot(evals_result['training']['multi_logloss'])\n",
    "plt.plot(evals_result['valid_1']['multi_logloss'])\n",
    "plt.legend([\"train_loss\",\"valid_loss\"])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "07edf18a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(18252, 8)"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c64b1776",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
